iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
0

因為我最終打算撰寫RESTful API,用以滿足存取資源的CRUD,所以勢必建立不同的Gateway API。接下來簡單解釋一點template.yaml的實作部分,如果之後增加內容的時候一樣會再重複提及。

template.yaml

首先我們看一下之前已經撰寫好的內容

AWSTemplateFormatVersion: 2010-09-09
Transform: "AWS::Serverless-2016-10-31"
Description: Lambda example

Resources:
  HelloLambda:
    Type: AWS::Serverless::Function
    Properties:
      Runtime: java8
      Handler: com.amazonaws.lambda.demo.LambdaFunctionHandler::handleRequest
      CodeUri: ./target/demo-1.0.0.jar
      Events:
        HelloLambdaApi:
          Type: Api
          Properties:
            Path: /hello
            Method: ANY

template定義

AWSTemplateFormatVersion: 2010-09-09

首先第一行是AWS template使用的版本定義,這邊目前只有唯一這個版本,相關的資訊是屬於AWS CloudFormation部分,用以定義AWS各種資源服務

Transform: "AWS::Serverless-2016-10-31"

第二行表示將使用到AWS::Serverless的轉換功能,AWS裡並沒有Serverless這項服務資源,而是提供將Serverless這個抽象的概念轉換對應到Lambda、API Gateway等其他服務。所以你也可以完整自己撰寫所有Lambda、API Gateway或其他資源描述,但是我相信使用Serverless轉換會更方便些。而這實際上是AWS Serverless Application Model (SAM)的open-source framework,完整或最新的內容應該要查找github的內容。
AWS Serverless Application Model (SAM)

AWS::Serverless::Function

轉換資源類型Serverless我們已經知道幾個properties的內容

  • Runtime:指定運行程式語言
  • Handler:指定handler method或class(使用預設method name)
  • CodeUri:程式碼內容位置
    而CodeUri在打包部署時還會自動轉換成S3位置,不過這容我之後再介紹

Events我們已經試過簡單的使用/hello從而觸發我們的HelloLambda處理了request/response。而現在我打算撰寫Person的RESTful API,會需要針對Person資源的GET/POST/PUT/PATCH/DELETE等method type進行處理。看習慣,也可以每種類型對應一個handler進行處理,但我這裡稍微試著將類似的類型用同一個method處置。

譬如說我想要
對於person資源的查詢
GET /person
針對person_id的資源內容取得
GET /person/{person_id}
template當中可以這麼寫

  GetPerson:
    Type: AWS::Serverless::Function
    Properties:
      Runtime: java8
      Handler: com.amazonaws.lambda.demo.PersonHandler::queryPerson
      CodeUri: ./target/demo-1.0.0.jar
      Events:
        QueryPersonApi:
          Type: Api
          Properties:
            Path: /person
            Method: GET
        GetPersonApi:
          Type: Api
          Properties:
            Path: /person/{person_id}
            Method: GET

當然我需要建立對應的PersonHandler class以及queryPerson method,不過當中我只需要判斷path是否存在person_id即可覺得是甚麼樣的資源要求了

接下來是新增/修改資料的POST, PUT, PATCH

  UpdatePerson:
    Type: AWS::Serverless::Function
    Properties:
      Runtime: java8
      Handler: com.amazonaws.lambda.demo.PersonHandler::updatePerson
      CodeUri: ./target/demo-1.0.0.jar
      Events:
        PostPersonApi:
          Type: Api
          Properties:
            Path: /person/{person_id}
            Method: POST
        PutPersonApi:
          Type: Api
          Properties:
            Path: /person/{person_id}
            Method: PUT
        PatchPersonApi:
          Type: Api
          Properties:
            Path: /person/{person_id}
            Method: PATCH

你會發現,雖然在SAM Local Mounting的時候最終還是會整合在同一個,但是Events單中必須各自描述定義

DELETE就比較單純了

  DletePerson:
    Type: AWS::Serverless::Function
    Properties:
      Runtime: java8
      Handler: com.amazonaws.lambda.demo.PersonHandler::deletePerson
      CodeUri: ./target/demo-1.0.0.jar
      Events:
        DeletePersonApi:
          Type: Api
          Properties:
            Path: /person/{person_id}
            Method: DELETE

這時候只要我們已經有正確的handler實作,SAM Local啟動時就可以正確看到API Gateway事件被掛載上去了

Mounting UpdatePerson at http://127.0.0.1:3000/person/{person_id} [PATCH, POST, PUT]
Mounting GetPerson at http://127.0.0.1:3000/person [GET]
Mounting DletePerson at http://127.0.0.1:3000/person/{person_id} [DELETE]
Mounting GetPerson at http://127.0.0.1:3000/person/{person_id} [GET]

上一篇
Day10-實作(二)Response
下一篇
Day12-實作(四)Request類型的基本判斷
系列文
從Java進入AWS部署RESTful API的心路歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言